#ifndef __WIZ_BASE_CORE_TYPE_REAL_HPP__SHANHAOBO_19800429__
#define __WIZ_BASE_CORE_TYPE_REAL_HPP__SHANHAOBO_19800429__

#include <float.h>

#include "../../../Config/WizConfig.hpp"
#include "./WizBaseCoreDeclare.hpp"

namespace Wiz
{
    namespace __Inner__
    {
        namespace Real32
        {
            typedef float                       Type;
        }
        namespace Real64
        {
            typedef double                      Type;
        }

        namespace Real
        {
#       if (WIZ_CFG_REAL_SIZE == 32)
            typedef ::Wiz::__Inner__::Real32::Type   Type;
#       elif (WIZ_CFG_REAL_SIZE == 64)
            typedef ::Wiz::__Inner__::Real64::Type   Type;
#       endif /*WIZ_CFG_REAL_SIZE*/
        }
    } /// end of namespace __Inner__

    namespace Real32
    {
        WIZ_DECLARE(::Wiz::__Inner__::Real32::Type);
        static const ::Wiz::Real32::Type Epsilon    = FLT_EPSILON;
        static const ::Wiz::Real32::Type EpsilonSqr = ::Wiz::Real32::Epsilon * ::Wiz::Real32::Epsilon;
        static const ::Wiz::Real32::Type Zero       = 0;
        static const ::Wiz::Real32::Type MaxZeroEp  = 0 + ::Wiz::Real32::Epsilon;
        static const ::Wiz::Real32::Type MinZeroEp  = 0 - ::Wiz::Real32::Epsilon;
        static const ::Wiz::Real32::Type One        = 1;
        static const ::Wiz::Real32::Type MaxOneEp   = 1 + ::Wiz::Real32::Epsilon;
        static const ::Wiz::Real32::Type MinOneEp   = 1 - ::Wiz::Real32::Epsilon;
        static const ::Wiz::Real32::Type Max        = FLT_MAX;
        static const ::Wiz::Real32::Type Min        = -::Wiz::Real32::Max;

        namespace Template
        {
            typedef ::Wiz::Real32::RefConst         Type;
        } /// end of namespace Template
        namespace Tmplt = Template;
    }; /// end of namespace Real32

    namespace Real64
    {
        WIZ_DECLARE(::Wiz::__Inner__::Real64::Type);
        static const ::Wiz::Real64::Type Epsilon    = DBL_EPSILON;
        static const ::Wiz::Real64::Type EpsilonSqr = ::Wiz::Real64::Epsilon * ::Wiz::Real64::Epsilon;
        static const ::Wiz::Real64::Type Zero       = 0;
        static const ::Wiz::Real64::Type MaxZeroEp  = 0 + ::Wiz::Real64::Epsilon;
        static const ::Wiz::Real64::Type MinZeroEp  = 0 - ::Wiz::Real64::Epsilon;
        static const ::Wiz::Real64::Type One        = 1;
        static const ::Wiz::Real64::Type MaxOneEp   = 1 + ::Wiz::Real64::Epsilon;
        static const ::Wiz::Real64::Type MinOneEp   = 1 - ::Wiz::Real64::Epsilon;
        static const ::Wiz::Real64::Type Max        = DBL_MAX;
        static const ::Wiz::Real64::Type Min        = 0 - ::Wiz::Real64::Max;

        namespace Template
        {
            typedef ::Wiz::Real64::RefConst         Type;
        } /// end of namespace Template
        namespace Tmplt = Template;
    }; /// end of namespace Real64

    namespace Real
    {
        WIZ_DECLARE(::Wiz::__Inner__::Real::Type);
#       if (WIZ_CFG_REAL_SIZE == 32)
            static const ::Wiz::Real32::Type Epsilon    = ::Wiz::Real32::Epsilon;
            static const ::Wiz::Real32::Type EpsilonSqr = ::Wiz::Real32::EpsilonSqr;
            static const ::Wiz::Real32::Type Zero       = ::Wiz::Real32::Zero;
            static const ::Wiz::Real32::Type MaxZeroEp  = ::Wiz::Real32::MaxZeroEp;
            static const ::Wiz::Real32::Type MinZeroEp  = ::Wiz::Real32::MaxZeroEp;
            static const ::Wiz::Real32::Type One        = ::Wiz::Real32::One;
            static const ::Wiz::Real32::Type MaxOneEp   = ::Wiz::Real32::MaxOneEp;
            static const ::Wiz::Real32::Type MinOneEp   = ::Wiz::Real32::MinOneEp;
            static const ::Wiz::Real32::Type Max        = ::Wiz::Real32::Max;
            static const ::Wiz::Real32::Type Min        = ::Wiz::Real32::Min;
#       elif (WIZ_CFG_REAL_SIZE == 64)
            static const ::Wiz::Real64::Type Epsilon    = ::Wiz::Real64::Epsilon;
            static const ::Wiz::Real64::Type EpsilonSqr = ::Wiz::Real64::EpsilonSqr;
            static const ::Wiz::Real64::Type Zero       = ::Wiz::Real64::Zero;
            static const ::Wiz::Real64::Type MaxZeroEp  = ::Wiz::Real64::MaxZeroEp;
            static const ::Wiz::Real64::Type MinZeroEp  = ::Wiz::Real64::MaxZeroEp;
            static const ::Wiz::Real64::Type One        = ::Wiz::Real64::One;
            static const ::Wiz::Real64::Type MaxOneEp   = ::Wiz::Real64::MaxOneEp;
            static const ::Wiz::Real64::Type MinOneEp   = ::Wiz::Real64::MinOneEp;
            static const ::Wiz::Real64::Type Max        = ::Wiz::Real64::Max;
            static const ::Wiz::Real64::Type Min        = ::Wiz::Real64::Min;
#       endif /*WIZ_CFG_REAL_SIZE*/

            namespace Template
            {
                typedef ::Wiz::Real::RefConst           Type;
            } /// end of namespace Template
            namespace Tmplt = Template;
    }; /// end of namespace Real
} /// end of namespace Wiz

#define WIZ_DECLARE_HELPER_REAL32(NamespacePath)                                \
    WIZ_DECLARE(::Wiz::Real32::Type)                                            \
    static const ::Wiz::Real32::Type Epsilon    = ::Wiz::Real32::Epsilon;       \
    static const ::Wiz::Real32::Type EpsilonSqr = ::Wiz::Real32::EpsilonSqr;    \
    static const ::Wiz::Real32::Type Zero       = ::Wiz::Real32::Zero;          \
    static const ::Wiz::Real32::Type MaxZeroEp  = ::Wiz::Real32::MaxZeroEp;     \
    static const ::Wiz::Real32::Type MinZeroEp  = ::Wiz::Real32::MaxZeroEp;     \
    static const ::Wiz::Real32::Type One        = ::Wiz::Real32::One;           \
    static const ::Wiz::Real32::Type MaxOneEp   = ::Wiz::Real32::MaxOneEp;      \
    static const ::Wiz::Real32::Type MinOneEp   = ::Wiz::Real32::MinOneEp;      \
    static const ::Wiz::Real32::Type Max        = ::Wiz::Real32::Max;           \
    static const ::Wiz::Real32::Type Min        = ::Wiz::Real32::Min;          
// WIZ_REAL_COMPARE_HELPER(NamespacePath);

#define WIZ_DECLARE_HELPER_REAL64(NamespacePath)                                \
    WIZ_DECLARE(::Wiz::Real64::Type)                                            \
    static const ::Wiz::Real64::Type Epsilon    = ::Wiz::Real64::Epsilon;       \
    static const ::Wiz::Real64::Type EpsilonSqr = ::Wiz::Real64::EpsilonSqr;    \
    static const ::Wiz::Real64::Type Zero       = ::Wiz::Real64::Zero;          \
    static const ::Wiz::Real64::Type MaxZeroEp  = ::Wiz::Real64::MaxZeroEp;     \
    static const ::Wiz::Real64::Type MinZeroEp  = ::Wiz::Real64::MaxZeroEp;     \
    static const ::Wiz::Real64::Type One        = ::Wiz::Real64::One;           \
    static const ::Wiz::Real64::Type MaxOneEp   = ::Wiz::Real64::MaxOneEp;      \
    static const ::Wiz::Real64::Type MinOneEp   = ::Wiz::Real64::MinOneEp;      \
    static const ::Wiz::Real64::Type Max        = ::Wiz::Real64::Max;           \
    static const ::Wiz::Real64::Type Min        = ::Wiz::Real64::Min;           
//  WIZ_REAL_COMPARE_HELPER(NamespacePath);

#endif /*__WIZ_BASE_CORE_TYPE_REAL_HPP__SHANHAOBO_19800429__*/
